/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package database;

import beans.*;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.LinkedList;

import javax.swing.JTable;

/**
 * 
 * @author Thomas Draxler
 */
public class DB_Access {

	private DataBase db;
	private Connection con = null;
	private DBCachedConnection dbcache;
	private PreparedStatement statUser;
	private PreparedStatement statAbrech;

	public DB_Access() throws FileNotFoundException, IOException,
			ClassNotFoundException, SQLException {
		db = DataBase.getInstance();
		con = db.getCon();
		dbcache = new DBCachedConnection(con);
	}

	public LinkedList<Abrechnung> getAbrechnungenVonUser(int MitarbeiterID)
			throws SQLException {
		LinkedList<Abrechnung> abrechnungen = new LinkedList<Abrechnung>();

		String sqlStr = "SELECT a.abrID,p.persID, p.persUnt, p.persSVNr, p.persVorname, p.persNachname, p.persAdr, p.persTelNr, "
				+ "p.persGebDatum, p.persGebOrt, p.persBezStatus, p.persAnstellDatum, p.persIsAVAB, p.persAnzKinder, p.persFreibetrag, "
				+ "p.persBrutto, p.persUeberstundenTeiler, p.persStundenlohn, p.persArt, p.persAnreise, a.abrDatum,a.abrBrutto,"
				+ "a.abrLst,a.abrSV,a.abrPendler,a.abrFreibetrag,a.abrGewerkschaftsbeitrag,a.abrServiceentgeld,"
				+ "a.abrBetriebsratumlage,a.abrAkonto,a.abrRegStunden,"
				+ "u.untID, u.untBez, u.untTelNr, u.untFaxNr, u.untUIDNr, u.untDVRNr, u.untIBAN, u.untAdr,u.untEmail, u.untFin, u.untKre, u.untKrank,\n"
				+ "ad.adrID, ad.adrStrasse, ad.adrPlz, ad.adrOrt,\n"
				+ "anr.anreiseID, anr.anreiseDistanz, anr.anreiseIsKleineZumutbar,\n"
				+ "pa.persArtID, pa.persArtBezeichnung,\n"
				+ "adU.adrStrasse, adU.adrPlz, adU.adrOrt,\n"
				+ "f.finID, f.finBez, f.finNr, f.finSteuernummer,\n"
				+ "k.kreID, k.kreBez, k.kreAdr, k.kreBlz, k.kreTelNr, k.kreFaxNr\n"
				+ "adK.adrStrasse, adK.adrPlz, adK.adrOrt,"
				+ "krank.krankID, krank.krankBez\n"
				+ "FROM abrechnung a\n"
				+ "INNER JOIN person p ON(a.abrPersID = p.persID)\n"
				+ "INNER JOIN unternehmen u ON(u.untID=p.persUnt)\n"
				+ "INNER JOIN adresse ad ON(ad.adrID= p.persAdr)\n"
				+ "INNER JOIN anreise anr ON(anr.anreiseID = p.persAnreise)\n"
				+ "INNER JOIN PersonArt pa ON(pa.persArtID = p.persArt)\n"
				+ "INNER JOIN Adresse adU ON(adU.adrID = u.untAdr)\n"
				+ "INNER JOIN Finanzamt f ON(f.finID = u.untFin)\n"
				+ "INNER JOIN Kreditinstitut k ON(k.kreID = u.untKre)\n"
				+ "INNER JOIN Adresse adK ON(adk.adrID = k.kreAdrIDF)"
				+ "INNER JOIN Krankenkasse krank ON(krank.krankID = u.untKrank)"
				+ "WHERE p.persid=" + MitarbeiterID + ";";
		PreparedStatement stat = con.prepareStatement(sqlStr);
		ResultSet rs = stat.executeQuery();
		while (rs.next()) {
			Unternehmen unt = new Unternehmen(rs.getInt("untID"),
					rs.getString("untBez"), rs.getString("untTelNr"),
					rs.getString("untFaxNr"), rs.getString("untUIDNr"),
					rs.getString("untDVRNr"), rs.getString("untIBAN"),
					new Adresse(rs.getString("adU.adrStrasse"), rs
							.getString("adU.adrPlz"), rs
							.getString("adU.adrOrt")),
					rs.getString("untEmail"), new Finanzamt(rs.getInt("finID"),
							rs.getString("finBez"), rs.getString("finNr"),
							rs.getString("finSteuernummer")),
					new Kreditinstitut(rs.getInt("k.kreID"), rs
							.getString("k.kreBez"), new Adresse(rs
							.getString("adK.Strasse"), rs.getString("adK.Plz"),
							rs.getString("adK.Ort")), rs.getString("k.kreBlz"),
							rs.getString("k.kreTelNr"), rs
									.getString("k.kreFaxNr")),
					new Krankenkasse(rs.getInt("krank.krankID"), rs
							.getString("krank.krankBez")));
			Person mitarbeiter = new Person(rs.getInt("persID"), unt,
					rs.getString("persSVNr"), rs.getString("persVorname"),
					rs.getString("persNachname"), new Adresse(
							rs.getString("ad.adrStrasse"),
							rs.getString("ad.adrPlz"),
							rs.getString("ad.adrOrt")),
					rs.getString("persTelNr"), new java.util.Date(rs.getDate(
							"persGebDatum").getTime()),
					rs.getString("persGebOrt"), rs.getString("persBezStatus"),
					new java.util.Date(rs.getString("persAnstellDatum")),
					rs.getInt("persIsAVAB"), rs.getInt("persAnzKinder"),
					rs.getFloat("persFreibetrag"), rs.getFloat("persBrutto"),
					rs.getInt("persUeberstundenTeiler"),
					rs.getFloat("persStundenlohn"), new PersonArt(
							rs.getInt("pa.persArtID"),
							rs.getString("pa.persArtBezeichnung")),
					new Anreise(rs.getInt("anr.anreiseID"), rs
							.getInt("anr.anreiseDistanz"), rs
							.getInt("anr.anreiseIsKleineZumutbar") == 0 ? false
							: true));
			Abrechnung abre = new Abrechnung(rs.getInt("a.abrID"), mitarbeiter,
					new java.util.Date(rs.getDate("a.abrDatum").getTime()),
					rs.getFloat("a.abrBrutto"), rs.getFloat("a.abrLst"),
					rs.getFloat("a.abrSV"), rs.getFloat("a.abrPendler"),
					rs.getFloat("a.abrFreibetrag"),
					rs.getFloat("a.abrGewerkschaftsbeitrag"),
					rs.getFloat("a.abrServiceentgeld"),
					rs.getFloat("a.abrBetriebsratumlage"),
					rs.getFloat("a.abrAkonto"), rs.getInt("a.abrRegStunden"));
			abrechnungen.add(abre);
		}
		return abrechnungen;
	}

	public void addAbrechnung(Abrechnung abrechnung) throws SQLException {
		String sql = "INSERT INTO Abrechnung"
				+ "(abrID, abrPersID, abrDatum, abrBrutto, abrLst, abrSV,"
				+ "abrPendler, abrFreibetrag, abrGewerkschaftsbeitrag, abrServiceentgeld, "
				+ "abrBetriebsratumlage, abrAkonto, abrRegStunden) VALUES "
				+ "(abrID_seq.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		if (statAbrech == null) {
			statAbrech = con.prepareStatement(sql);
		}
		statAbrech.setInt(1, abrechnung.getPerson().getPersID());
		statAbrech.setDate(2, new java.sql.Date(abrechnung.getAbrDatum()
				.getTime()));
		statAbrech.setFloat(3, abrechnung.getAbrBrutto());
		statAbrech.setFloat(4, abrechnung.getAbrLst());
		statAbrech.setFloat(5, abrechnung.getAbrSV());
		statAbrech.setFloat(6, abrechnung.getAbrPendler());
		statAbrech.setFloat(7, abrechnung.getAbrFreibetrag());
		statAbrech.setFloat(8, abrechnung.getAbrGewerkschaftsbeitrag());
		statAbrech.setFloat(9, abrechnung.getAbrServiceentgeld());
		statAbrech.setFloat(10, abrechnung.getAbrBetriebsratumlage());
		statAbrech.setFloat(11, abrechnung.getAbrAkonto());
		statAbrech.setInt(12, abrechnung.getAbrRegStunden());
		statAbrech.executeUpdate();
	}

	public boolean checkUser(String user, String passwd) throws SQLException {
		String sqlStr = "SELECT userID FROM benutzer WHERE benutzername = " + user
				+ " AND passwort = " + passwd;
		statUser = con.prepareStatement(sqlStr);
		ResultSet rs = statUser.executeQuery();
		while (rs.next()) {
			return true;
		}
		return false;
	}

	public LinkedList<Person> getAlleMitarbeiterByUnternehmen(int unternehmenid) throws Exception {
		LinkedList<Person> mitarbeiter = new LinkedList<Person>();
		String sqlStr = "SELECT p.persID, p.persUntID, p.persSVNr, p.persVorname, p.persNachname, p.persAdrID, "
				+ "p.persTelNr, p.persGebDatum, p.persGebOrt, p.persBezStatus, p.persAnstellDatum, p.persIsAVAB, "
				+ "p.persAnzKinder, p.persFreibetrag, p.persBrutto, p.persUeberstundenTeiler, p.persStundenlohn, p.persAnreiseID, "
				+ "u.untID, u.untBez, u.untTelNr, u.untFaxNr, u.untUIDNr, u.untDVRNr, u.untIBAN, u.untAdrID,u.untEmail, u.untFinID, u.untKreID, u.untKrankID,\n"
				+ "ad.adrID, ad.adrStrasse, ad.adrPlz, ad.adrOrt,\n"
				+ "anr.anreiseID, anr.anreiseDistanz, anr.anreiseIsKleineZumutbar,\n"
				+ "pa.persArtID, pa.persArtBezeichnung,\n"
				+ "adU.adrStrasse \"uadrstrasse\", adU.adrPlz \"uadrplz\", adU.adrOrt \"uadrort\",\n"
				+ "f.finID, f.finBez, f.finNr, f.finSteuernummer,\n"
				+ "k.kreID, k.kreBez, k.kreAdrID, k.kreBlz, k.kreTelNr, k.kreFaxNr,\n"
				+ "adK.adrStrasse \"kadrstrasse\", adK.adrPlz \"kadrplz\", adK.adrOrt \"kadrort\","
				+ "krank.krankID, krank.krankBez\n"
				+ "FROM person p\n"
				+ "INNER JOIN unternehmen u ON(u.untID=p.persUntID)\n"
				+ "INNER JOIN adresse ad ON(ad.adrID= p.persAdrID)\n"
				+ "INNER JOIN anreise anr ON(anr.anreiseID = p.persAnreiseID)\n"
				+ "INNER JOIN PersonArt pa ON(pa.persArtID = p.persArtID)\n"
				+ "INNER JOIN Adresse adU ON(adU.adrID = u.untAdrID)\n"
				+ "INNER JOIN Finanzamt f ON(f.finID = u.untFinID)\n"
				+ "INNER JOIN Kreditinstitut k ON(k.kreID = u.untKreID)\n"
				+ "INNER JOIN Adresse adK ON(adk.adrID = k.kreAdrID)"
				+ "INNER JOIN Krankenkasse krank ON(krank.krankID = u.untKrankID)\n"
                        + "WHERE p.persUntID = "+ unternehmenid+";";
                System.out.println(sqlStr);
		Statement stat = dbcache.getStatement();
		ResultSet rs = stat.executeQuery(sqlStr);
		while (rs.next()) {
			Unternehmen unt = new Unternehmen(rs.getInt("untID"),
					rs.getString("untBez"), rs.getString("untTelNr"),
					rs.getString("untFaxNr"), rs.getString("untUIDNr"),
					rs.getString("untDVRNr"), rs.getString("untIBAN"),
					new Adresse(rs.getString("uadrStrasse"), rs
							.getString("uadrPlz"), rs
							.getString("uadrOrt")),
					rs.getString("untEmail"), new Finanzamt(rs.getInt("finID"),
							rs.getString("finBez"), rs.getString("finNr"),
							rs.getString("finSteuernummer")),
					new Kreditinstitut(rs.getInt("kreID"), rs
							.getString("kreBez"), new Adresse(rs
							.getString("kadrstrasse"), rs.getString("kadrplz"),
							rs.getString("kadrort")), rs.getString("kreBlz"),
							rs.getString("kreTelNr"), rs
									.getString("kreFaxNr")),
					new Krankenkasse(rs.getInt("krankID"), rs
							.getString("krankBez")));
			Person mita = new Person(rs.getInt("persID"), unt,
					rs.getString("persSVNr"), rs.getString("persVorname"),
					rs.getString("persNachname"), new Adresse(
							rs.getString("adrStrasse"),
							rs.getString("adrPlz"),
							rs.getString("adrOrt")),
					rs.getString("persTelNr"), new java.util.Date(rs.getDate(
							"persGebDatum").getTime()),
					rs.getString("persGebOrt"), rs.getString("persBezStatus"),
					new java.util.Date(rs.getDate("persAnstellDatum").getTime()),
					rs.getInt("persIsAVAB"), rs.getInt("persAnzKinder"),
					rs.getFloat("persFreibetrag"), rs.getFloat("persBrutto"),
					rs.getInt("persUeberstundenTeiler"),
					rs.getFloat("persStundenlohn"), new PersonArt(
							rs.getInt("persArtID"),
							rs.getString("persArtBezeichnung")),
					new Anreise(rs.getInt("anreiseID"), rs
							.getInt("anreiseDistanz"), rs
							.getInt("anreiseIsKleineZumutbar") == 0 ? false
							: true));
			mitarbeiter.add(mita);
		}
		dbcache.releaseStatement(stat);
		return mitarbeiter;
	}

	/**
	 * Anreise fehlt
	 * @param p
	 * @throws Exception
	 */
	public void hinzMitarbeiter(Person p) throws Exception {
		String sql = "INSERT INTO Adresse"
				+ "(adrID, adrStrasse, adrPlz, adrOrt)"
				+ "VALUES (adrid_seq.NEXTVAL, '" + p.getAdresse().getStrasse()
				+ "', '" + p.getAdresse().getPlz() + "', '"
				+ p.getAdresse().getOrt() + "')";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);

		sql = "INSERT INTO Anreise"
				+ "(anreiseID, anreiseDistanz, anreiseIsKleineZumutbar)"
				+ "(anreiseID_seq.NEXTVAL, )";
		stat.executeUpdate(sql);
		dbcache.releaseStatement(stat);

		sql = "INSERT INTO Person"
				+ "(persID, persUntID, persSVNr, persVorname, persNachname,"
				+ "persAdrID, persTelNr, persGebDatum, persGebOrt, persBezStatus,"
				+ "persAnstellDatum, persIsAVAB, persAnzKinder, persFreibetrag, "
				+ "persBrutto, persUeberstundenTeiler, persStundenlohn, "
				+ "persArtID, persAnreiseID) "
				+ "VALUES(persID_seq.NEXTVAL, ?, ? ,? ,? ,adrid_seq.CURVAL ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? ,? , anreiseID_seq.CURVAL)";
		PreparedStatement pStat = con.prepareStatement(sql);
		pStat.setInt(1, p.getUnternehmen().getUntID());
		pStat.setString(2, p.getPersSVNR());
		pStat.setString(3, p.getPersVorname());
		pStat.setString(4, p.getPersNachname());
		pStat.setString(5, p.getPersTelNr());
		pStat.setDate(6, new java.sql.Date(p.getPersGebDatum().getTime()));
		pStat.setString(7, p.getPersGebOrt());
		pStat.setString(8, p.getPersBezStatus());
		pStat.setDate(9, new java.sql.Date(p.getPersAnstellDatum().getTime()));
		pStat.setInt(10, p.getPersIsAVAB());
		pStat.setInt(11, p.getPersAnzKinder());
		pStat.setFloat(12, p.getPersFreibetrag());
		pStat.setFloat(13, p.getPersBrutto());
		pStat.setInt(14, p.getPersUeberstundenTeiler());
		pStat.setFloat(15, p.getPersStundenlohn());
		pStat.setInt(16, p.getPersArt().getPersArtID());

		pStat.executeUpdate();
	}

	public LinkedList<AbrechnungUberstunden> getUeberstunden(int abrid)
			throws Exception {
		LinkedList<AbrechnungUberstunden> list = new LinkedList<AbrechnungUberstunden>();
		String sqlStr = "SELECT ub.ueberAbrID, ub.ueberArtID, ub.ueberAbrStunden, ub.ueberAbrFrei, ub.ueberAbrPfl,\n"
				+ "ua.ueberArtBezeichnung, ua.ueberArtBetrag\n"
				+ "FROM abrechnungUeberstunden ub\n"
				+ "INNER JOIN abrechnungUeberstundenArt ua ON(ub.ueberartid = ua.ueberartid)\n"
				+ "WHERE ub.ueberAbrID = " + abrid + ";";
		Statement stat = dbcache.getStatement();
		ResultSet rs = stat.executeQuery(sqlStr);

		while (rs.next()) {
			list.add(new AbrechnungUberstunden(rs.getInt(1),
					new AbrechnungUeberstundenArt(rs.getInt(2),
							rs.getString(6), rs.getFloat(7)), rs.getInt(3), rs
							.getInt(4), rs.getInt(5)));
		}
		return list;
	}

	public void addUeberstunde(AbrechnungUberstunden ueberstunde)
			throws Exception {
		String sqlStr = String
				.format("INSERT INTO abrechnungUeberstundenArt(ueberAbrID, ueberArtID, ueberAbrStunden, ueberAbrFrei, ueberAbrPfl)\n"
						+ "VALUES(%d, %d, %f, %f, %f);", ueberstunde
						.getUeberAbrID(), ueberstunde.getUeberArt()
						.getUeberArtID(), ueberstunde.getUeberAbrStunden(),
						ueberstunde.getUeberAbrFrei(), ueberstunde
								.getUeberAbrPfl());
		Statement stat = dbcache.getStatement();
		stat.execute(sqlStr);
		dbcache.releaseStatement(stat);
	}

	public LinkedList<AbrechnungUeberstundenArt> getAbrechnungUeberstundenArten()
			throws Exception {
		LinkedList<AbrechnungUeberstundenArt> list = new LinkedList<AbrechnungUeberstundenArt>();
		String sqlStr = "SELECT ueberArtID, ueberArtBezeichnung, ueberArtBetrag\n"
				+ "FROM abrechnungUeberstundenArt;";
		Statement stat = dbcache.getStatement();
		ResultSet rs = stat.executeQuery(sqlStr);

		while (rs.next()) {
			list.add(new AbrechnungUeberstundenArt(rs.getInt(1), rs
					.getString(2), rs.getFloat(3)));
		}
		dbcache.releaseStatement(stat);
		return list;
	}

	public void addAbrechnungUeberstundenArt(AbrechnungUeberstundenArt art)
			throws Exception {
		String sqlStr = "INSERT INTO abrechnungUeberstundenArt(ueberArtBezeichnung, ueberArtBetrag)\n"
				+ "VALUES('"
				+ art.getUeberArtBezeichnung()
				+ "', "
				+ art.getUeberArtBetrag() + ");";
		Statement stat = dbcache.getStatement();
		stat.execute(sqlStr);
		dbcache.releaseStatement(stat);

	}

	public LinkedList<Unternehmen> getUnternehmen() throws Exception {
		LinkedList<Unternehmen> liste = new LinkedList<Unternehmen>();
		String sqlStr = "SELECT u.untID, u.untBez, u.untTelNr, u.untFaxNr, u.untUIDNr, u.untDVRNr, u.untIBAN, u.untAdrID, u.untEmail, u.untFinID, u.untKreID,"
				+ "u.untKrankID, a.adrID, a.adrStrasse, a.adrPlz, a.adrOrt, \n"
				+ "f.finID, f.finBez, f.finNr, f.finSteuernummer,\n"
				+ "k.kreID, k.kreBez, k.kreAdrID, k.kreBlz, k.kreTelNr, k.kreFaxNr,\n"
				+ "ka.adrStrasse, ka.adrPlz, ka.adrOrt, \n"
				+ "kk.krankID, kk.krankBez\n"
				+ "FROM Unternehmen u\n"
				+ "INNER JOIN Adresse a ON(a.adrid = u.untAdrID)\n"
				+ "INNER JOIN Finanzamt f ON(u.untFinID = f.finID)\n"
				+ "INNER JOIN Kreditinstitut k ON(k.kreID = u.untKreID)\n"
				+ "INNER JOIN Adresse ka ON(ka.adrid = k.kreAdrID)\n"
				+ "INNER JOIN Krankenkasse kk ON(kk.krankID = u.untKreID)";
		Statement stat = dbcache.getStatement();
                System.out.println(sqlStr);
		ResultSet rs = stat.executeQuery(sqlStr);

		while (rs.next()) {
			liste.add(new Unternehmen(rs.getInt(1), rs.getString(2), rs
					.getString(3), rs.getString(4), rs.getString(5), rs
					.getString(6), rs.getString(7), new Adresse(rs
					.getString(14), rs.getString(15), rs.getString(16)), rs
					.getString(8), new Finanzamt(rs.getInt(17), rs
					.getString(18), rs.getString(19), rs.getString(20)),
					new Kreditinstitut(rs.getInt(21), rs.getString(22),
							new Adresse(rs.getString(27), rs.getString(28), rs
									.getString(29)), rs.getString(24), rs
									.getString(25), rs.getString(26)),
					new Krankenkasse(rs.getInt(30), rs.getString(31))));
		}
		return liste;
	}

	public void createUnternehmen(Unternehmen u) throws Exception {
		int adr = u.getUntAdr().getAdrID();
		int fin = u.getUntFin().getFinID();
		int kk = u.getUntKrank().getKrankID();
		int kred = u.getUntKre().getKreID();
		if(adr == 0){
			adr = addAdresse(u.getUntAdr());
		}
		if(fin == 0){
			fin = addFinanzamt(u.getUntFin());
		}
		if(kred == 0){
			kred = addKreditinstitut(u.getUntKre());
		}
		if(kk == 0){
			kk = addKrankenkasse(u.getUntKrank());
		}
		String sqlStr = String.format("INSERT INTO Unternehmen"
				+ "(untID, untBez, untTelNr, untFaxNr, untUIDNr, untDVRNr, untIBAN, "
				+ "untAdrID, untEmail, untFinID, untKreID, untKrankID)"
				+ " VALUES (untid_seq.NEXTVAL, '%s', '%s', '%s', '%s', '%s', '%s'"
				+ ", %i, '%s', %i, %i, %i)",
				u.getUntBez(), u.getUntTelNr(), u.getUntFaxNr(), u.getUntUIDNr(), u.getUntDVRNr(), u.getUntIBAN(),
				adr, u.getUntEmail(), fin, kred, kk);
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sqlStr);
		dbcache.releaseStatement(stat);
	}

	public void deleteUnternehmen(int UnternehmenID) throws Exception {
		String sqlStr = "DELETE FROM Unternehmen WHERE untID = "+UnternehmenID+";";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sqlStr);
		dbcache.releaseStatement(stat);
	}

	public void createUser(User u) {
		/*
		 * String sqlStr = "INSERT INTO Benutzer" +
		 * "(benBenutzername, benPasswort, benUntID, benPersID, benArtID)" +
		 * "('"++"','"++"','"++"','"++"','"++"')";
		 */
	}
	
	/**
	 * Anreise fehlt!!!
	 * @param MitarbeiterID
	 * @param p
	 * @throws Exception
	 */
	public void changeMitarbeiter(int MitarbeiterID, Person p) throws Exception {
		String sql = "UPDATE Adresse"
				+ "SET adrStrasse = '" + p.getAdresse().getStrasse()
				+ "', adrPlz = '" + p.getAdresse().getPlz() + "', adrOrt = '"
				+ p.getAdresse().getOrt() + "'\n"
						+ "WHERE adrID = "+p.getAdresse().getAdrID();
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);

		/*sql = "UPDATE Anreise"
				+ "(, anreiseDistanz, anreiseIsKleineZumutbar)"
				+ "WHERE anreiseID = "+p.getPer;
		stat.executeUpdate(sql);
		dbcache.releaseStatement(stat);*/

		sql = "UPDATE Person\n"
				+ "SET persUntID= ?, persSVNr= ?, persVorname= ?, persNachname = ?,"
				+ "persAdrID= ?, persTelNr= ?, persGebDatum= ?, persGebOrt= ?, persBezStatus = ?,"
				+ "persAnstellDatum= ?, persIsAVAB= ?, persAnzKinder= ?, persFreibetrag = ?, "
				+ "persBrutto= ?, persUeberstundenTeiler= ?, persStundenlohn = ?, "
				+ "persArtID= ?, persAnreiseID = ?\n"
				+ "WHERE persID = ?";
		PreparedStatement pStat = con.prepareStatement(sql);
		pStat.setInt(16, p.getUnternehmen().getUntID());
		pStat.setString(1, p.getPersSVNR());
		pStat.setString(2, p.getPersVorname());
		pStat.setString(3, p.getPersNachname());
		pStat.setString(4, p.getPersTelNr());
		pStat.setDate(5, new java.sql.Date(p.getPersGebDatum().getTime()));
		pStat.setString(6, p.getPersGebOrt());
		pStat.setString(7, p.getPersBezStatus());
		pStat.setDate(8, new java.sql.Date(p.getPersAnstellDatum().getTime()));
		pStat.setInt(9, p.getPersIsAVAB());
		pStat.setInt(10, p.getPersAnzKinder());
		pStat.setFloat(11, p.getPersFreibetrag());
		pStat.setFloat(12, p.getPersBrutto());
		pStat.setInt(13, p.getPersUeberstundenTeiler());
		pStat.setFloat(14, p.getPersStundenlohn());
		pStat.setInt(15, p.getPersArt().getPersArtID());

		pStat.executeUpdate();
	}
	
	public void deleteMitarbeiter(String benutzername) {
		/*String sqlString = "DELETE FROM benutzer WHERE benBenutzername = "
				+ benutzername;
		PreparedStatement stat = con.prepareStatement(sqlStr);
		stat.executeUdpate();*/

	}

	public void getPendlerpauschale() {
		//LinkedList<Pendlerpauschale> liste = new LinkedList<Pendlerpauschale>();
		
		//liste.add(new Pendlerpauschale(penID, penUntergrenze, penObergrenze, penBetrag, penIsKleine));
	}

	public void changePendlerpauschale(Pendlerpauschale p) {

	}
	
	public int addAdresse(Adresse a) throws Exception{
		int id = 0;
		String sql = "INSERT INTO Adresse"
				+ "(adrID, adrStrasse, adrPlz, adrOrt)"
				+ "VALUES (adrid_seq.NEXTVAL, '" + a.getStrasse()
				+ "', '" + a.getPlz() + "', '"
				+ a.getOrt() + "')";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);
		
		sql = "SELECT adrID FROM Adresse\n"
				+ "WHERE adrStrasse = '"+a.getStrasse()+"' AND adrPlz = '"+a.getPlz()+"' AND adrOrt = '"+a.getOrt()+"';";
		ResultSet rs = stat.executeQuery(sql);
		if(rs.next()){
			id = rs.getInt(1);
		}
		dbcache.releaseStatement(stat);
		return id;
	}

	public int addFinanzamt(Finanzamt f) throws Exception{
		int id = 0;
		String sql = "INSERT INTO Finanzamt"
				+ "(finID, finBez, finNr, finSteuernummer)"
				+ "VALUES (finID_seq.NEXTVAL, '" + f.getFinBez()
				+ "', '" + f.getFinNr() + "', '"
				+ f.getFinSteuernummer() + "')";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);
		
		sql = "SELECT finID FROM Finanzamt\n"
				+ "WHERE finBez = '"+ f.getFinBez() +"' AND finNr = '"+ f.getFinNr() +"' AND finSteuernummer = '"+ f.getFinSteuernummer() +"';";
		ResultSet rs = stat.executeQuery(sql);
		if(rs.next()){
			id = rs.getInt(1);
		}
		dbcache.releaseStatement(stat);
		return id;
	}
	
	public int addKreditinstitut(Kreditinstitut k) throws Exception{
		int id = 0;
		int ad = k.getKreAdr().getAdrID();
		if(ad == 0){
			ad = addAdresse(k.getKreAdr());
		}
		String sql = "INSERT INTO Kreditinstitut"
				+ "(kreID, kreBez, kreAdrID, kreBlz, kreTelNr, kreFaxNr)"
				+ "VALUES (kreID_seq.NEXTVAL, '" + k.getKreBez() + ", "+ad
				+ "', '" + k.getKreBlz() + "', '"
				+ k.getKreTelNr() + "', '"+k.getKreFaxNr()+"')";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);
		
		sql = "SELECT kreID FROM Kreditinstitut\n"
				+ "WHERE kreBez = '"+ k.getKreBez() +"' AND kreAdrID = "+ ad +" AND kreBlz = '"+ k.getKreBlz() +"';";
		ResultSet rs = stat.executeQuery(sql);
		if(rs.next()){
			id = rs.getInt(1);
		}
		dbcache.releaseStatement(stat);
		
		return id;
	}
	
	public int addKrankenkasse(Krankenkasse k) throws Exception{
		int id = 0;
		
		String sql = "INSERT INTO Krankenkasse"
				+ "(krankID, krankBez)"
				+ "VALUES (krankID_seq.NEXTVAL, '" + k.getKrankBez()+"')";
		Statement stat = dbcache.getStatement();
		stat.executeUpdate(sql);
		
		sql = "SELECT krankID FROM Krankenkasse\n"
				+ "WHERE krankBez = '"+ k.getKrankBez()+"';";
		ResultSet rs = stat.executeQuery(sql);
		if(rs.next()){
			id = rs.getInt(1);
		}
		dbcache.releaseStatement(stat);
		
		return id;
	}
        
        public LinkedList<AEAV> getAEAV() throws Exception{
            LinkedList<AEAV> liste = new LinkedList<AEAV>();
		String sqlStr = "SELECT l.steuerID, l.steueruntergrenze, l.steuerobergrenze, l.steuersatz, a.AEAVohneKind, a.AEAVkind1, a.AEAVkind2, a.AEAVkind3, a.AEAVkind4, \n" +
                    "a.AEAVkind5, a.AEAVabstufung\n" +
                    " FROM AEAV a\n" +
                    " INNER JOIN lohnsteuer l ON (l.steuerid = a.AEAVsteuerid);\n";
		Statement stat = dbcache.getStatement();
		ResultSet rs = stat.executeQuery(sqlStr);

		while (rs.next()) {
			liste.add(new AEAV(new Lohnsteuer(rs.getInt(1), rs.getFloat(2), rs.getFloat(3), rs.getFloat(4)), rs.getFloat(5), rs.getFloat(6), rs.getFloat(7), rs.getFloat(8), rs.getFloat(9), rs.getFloat(10), rs.getFloat(11)));
		}
		return liste;
        }
        
        public void schreibeAEAV(LinkedList<AEAV> list) throws SQLException{
            String sqlDelLohns = "DELETE FROM lohnsteuer\n"
				+ "WHERE steuerid = ?";
	    PreparedStatement pStatDelLohn = con.prepareStatement(sqlDelLohns);
            String sqlDelAEAV = "DELETE FROM aeav\n"
				+ "WHERE AEAVsteuerid = ?";
	    PreparedStatement pStatDelAEAV = con.prepareStatement(sqlDelAEAV);
            String sqlInsLohn = "INSERT INTO Lohnsteuer\n" +
                    "(steuerID, steuerUntergrenze, steuerObergrenze, steuersatz) VALUES\n" +
                    "(?, ?, ?, ?);";
	    PreparedStatement pStatInsLohn = con.prepareStatement(sqlInsLohn);
            
            String sqlInsAeav = "INSERT INTO AEAV\n" +
                    "(AEAVsteuerID, AEAVohneKind, AEAVkind1, AEAVkind2, AEAVkind3, AEAVkind4, \n" +
                    "	AEAVkind5, AEAVabstufung) VALUES\n" +
                    "(?, ?, ?, ?, ?, ?, ?, ?);";
	    PreparedStatement pStatInsAeav = con.prepareStatement(sqlInsAeav);
            for (AEAV aeav : list) {
                pStatDelAEAV.setInt(1, aeav.getAeavsteuer().getSteuerID());
                pStatDelAEAV.executeUpdate();
                
                pStatDelLohn.setInt(1, aeav.getAeavsteuer().getSteuerID());
                pStatDelLohn.executeUpdate();
                
                pStatInsLohn.setInt(1, aeav.getAeavsteuer().getSteuerID());
                pStatInsLohn.setFloat(2, aeav.getAeavsteuer().getSteuerUntergrenze());
                pStatInsLohn.setFloat(3, aeav.getAeavsteuer().getSteuerObergrenze());
                pStatInsLohn.setFloat(4, aeav.getAeavsteuer().getSteuersatz());
                pStatInsLohn.executeUpdate();
                
                pStatInsAeav.setInt(1, aeav.getAeavsteuer().getSteuerID());
                pStatInsAeav.setFloat(2, aeav.getAEAVohneKind());
                pStatInsAeav.setFloat(3, aeav.getAEAVkind1());
                pStatInsAeav.setFloat(4, aeav.getAEAVkind2());
                pStatInsAeav.setFloat(5, aeav.getAEAVkind3());
                pStatInsAeav.setFloat(6, aeav.getAEAVkind4());
                pStatInsAeav.setFloat(7, aeav.getAEAVkind5());
                pStatInsAeav.setFloat(8, aeav.getAEAVabstufung());
                pStatInsAeav.executeUpdate();
            }
        }
}